package com.nave.segundaguerra.activity.views;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

import com.example.honraepodercliente.R;
import com.nave.segundaguerra.activity.ConnectionSet;
import com.nave.segundaguerra.servidorecliente.cliente.ControleDeUsuarioCliente;
import com.nave.segundaguerra.servidorecliente.cliente.DadosDoCliente;
import com.nave.segundaguerra.servidorecliente.cliente.MapaCliente;
import com.nave.segundaguerra.servidorecliente.cliente.PlayerCliente;
import com.nave.segundaguerra.servidorecliente.cliente.SoldadoCliente;
import com.nave.segundaguerra.servidorecliente.cliente.TiroCliente;
import com.nave.segundaguerra.servidorecliente.cliente.ViewPort;
import com.nave.segundaguerra.servidorecliente.servidor.PlayerServer;
import com.nave.segundaguerra.servidorecliente.servidor.TiroServer;
import com.nave.segundaguerra.servidorecliente.util.ActivityUtil;
import com.nave.segundaguerra.servidorecliente.util.BitmapStorage;
import com.nave.segundaguerra.servidorecliente.util.Connection;
import com.nave.segundaguerra.servidorecliente.util.ElMatador;
import com.nave.segundaguerra.servidorecliente.util.ImageLibrary;
import com.nave.segundaguerra.servidorecliente.util.Killable;
import com.nave.segundaguerra.servidorecliente.util.RectLibrary;


public class GameView extends View implements Runnable, Killable {

	private final String TAG = "Game View";

	private RelativeLayout container;
	private Paint paint;
	private long interval = 10;

	private int canvasWidth = 0;
	private int canvasHeight = 0;

	private Bitmap bg;
	private ControleDeUsuarioCliente clientManagerData;

	private int fontSize = 20;
	private boolean ativo = true;

	public ViewPort viewPort;
	public MapaCliente mapa;

	PlayerCliente meuJogador;


	private Point[] dedos = new Point[2];

	public GameView(Context context, Connection connection,
			RelativeLayout container) {
		super(context);

		ElMatador.getInstance().add(this);

		this.container = container;

		this.clientManagerData = (ControleDeUsuarioCliente) connection.getHandler();
		this.clientManagerData.playGame();

		this.setBackgroundResource(R.drawable.cenario1);
		
		paint = new Paint();
		paint.setColor(Color.BLACK);
		paint.setTextSize(fontSize);

		this.bg = BitmapStorage.getInstance().getCenario();
		ImageLibrary.getInstance().addImage("Soldado","Arte/Characters/assault_flameshot01.png",context);
		RectLibrary.getInstance().addRectFromBitmap("Soldado", "Soldado", 10);
		
		meuJogador = new SoldadoCliente("Nuno", new Point(100,100));
		meuJogador.setDadosCliente(new DadosDoCliente(connection, 30));
		
		Thread threadDados = new Thread(meuJogador.getDadosCliente());
		threadDados.start();
		
		meuJogador.sendDadosIniciais();
		// Send a message to server
		// Indicate this player how a new player in the game

		Thread thread = new Thread(this);
		thread.start();

	}

	protected void onSizeChanged(int w, int h, int oldw, int oldh) {

		Log.i(TAG, "OnSizeChanged w: " + w);
		Log.i(TAG, "OnSizeChanged h: " + h);
		Log.i(TAG, "OnSizeChanged old w: " + oldw);
		Log.i(TAG, "OnSizeChanged old h: " + oldh);

		this.canvasWidth = w;
		this.canvasHeight = h;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(bg.getWidth(), bg.getHeight());
	}

	public void run() {
		while (ativo) {
			try {
				Thread.sleep(this.interval);
			} catch (InterruptedException e) {
				Log.i(TAG, "interrupcao do run()");
			}
			update();
			postInvalidate();
		}
	}

	int currentX = 0;
	int currentY = 0;

	public boolean onTouchEvent(MotionEvent event) {

		int id = 0;
		
		Log.i(TAG,
				"scrollx and scrolly: "
						+ String.valueOf(this.container.getScrollX()) + ", "
						+ String.valueOf(this.container.getScrollY()));
		
		for(int i = 0; i < dedos.length; i++)
		{
			if (i < event.getPointerCount())
			{
				id = event.getPointerId(i);
				dedos[i] = new Point((int)(event.getX(id) - meuJogador.getPosition().x),
						(int) (event.getY(id) - meuJogador.getPosition().y));
			}
		}

		switch (event.getAction()) {

		case MotionEvent.ACTION_DOWN: {

			currentX = (int) event.getRawX();
			currentY = (int) event.getRawY();

			//meuJogador.sendPos(dedos[0]);
			ConnectionSet.getConnection().Send("Motion Event: Action Down");
			Log.i("Toque", "Primeiro toque");

			break;
		}

		case MotionEvent.ACTION_MOVE:

			// ConnectionSet.getConnection().Send("Motion Event: Action Move");
			Log.i("Toque", "Movendo toque");

			int x2 = (int) event.getRawX();
			int y2 = (int) event.getRawY();
			//meuJogador.sendPos(dedos[0]);
//			int plusScrollX = currentX - x2;
//			int plusScrollY = currentY - y2;
			//meuJogador.dirViewPort(new Point(currentX,currentY), new Point(x2, y2), new Point(this.canvasWidth, this.canvasHeight), this.container);
			//meuJogador.setPos(meuJogador.getDadosCliente(), new Point(plusScrollX, plusScrollY));
			currentX = x2;
			currentY = y2;

			break;

		case MotionEvent.ACTION_UP:
			ConnectionSet.getConnection().Send("Motion Event: Action Up");

			meuJogador.sendPos(new Point(0, 0));
			Log.i("Toque", "Retirado 1 toque");
			break;

		case MotionEvent.ACTION_POINTER_DOWN:

			ConnectionSet.getConnection().Send("Motion Event: Action Down");
			Log.i("Toque", "Segundo toque");
			break;

		}
		return true;

	}

	// ##### UPDATE #####
	private void update() {

	}

	// ##### DRAW #####
	public void draw(Canvas canvas) {
		super.draw(canvas);
		
		/*canvas.drawCircle(100, 10, 50, paint);
		canvas.drawCircle(400, 10, 50, paint);
		canvas.drawCircle(10, 200, 50, paint);*/
		
		ConcurrentHashMap<String, PlayerCliente> jogadores = clientManagerData
				.getJogadores();

		//Log.e("TesteLista", "quantidade: " + jogadores.size()); 
		Iterator<String> iterator = jogadores.keySet().iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			PlayerCliente jogador = jogadores.get(key);
			jogador.draw(canvas);
			jogador.Update();
			//canvas.drawCircle(jogador.getPosition().x, jogador.getPosition().y, 10, new Paint());
			//Log.i("NomeJogador", jogador.getNome());
			//Log.i("NomeDoJogador", jogador.getNome() + "," + jogador.getPosition().x + "," + jogador.getPosition().y + "," + jogador.getTime() + "," + jogador.getMinhaClasse());
		}
	}

	public void killMeSoftly() {
		ativo = false;
	}

}
